package cn.newgrand.netcall.consultant.ui;

import org.jivesoftware.spark.component.Table;
import cn.newgrand.netcall.consultant.components.ButtonCellEditor;
import cn.newgrand.netcall.consultant.components.LabelCellEditor;
import cn.newgrand.smackx.consultant.entity.SearchSpecialistEntity;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * UserSearchResults displays the UI for all users found using the JEP-055 search service.
 */
public class SpecialistSearchResults extends JPanel {
    private UsersInfoTable resultsTable;

    /**
     * Intiliaze the Search Service Results UI.
     */
    public SpecialistSearchResults() {
        setLayout(new BorderLayout());
    }

//    /**
//     * Populate the SearchResults UI table with the ReportedData returned from the search service.
//     *
//     * @param data the <code>ReportedData</code> returned by the Search Service.
//     */ 
//    public void showUsersFound(ReportedData data) {
//        List<String> columnList = new ArrayList<String>();
//        Iterator columns = data.getColumns();
//        while (columns.hasNext()) {
//            ReportedData.Column column = (ReportedData.Column)columns.next();
//            String label = column.getLabel();
//            columnList.add(label);
//        }
//        //汉化搜索列的名称
////        String[] strs = {"JID号","用户名","昵称","邮箱"};
////        columnList = Arrays.asList(strs);
//
//        if (resultsTable == null) {
//            resultsTable = new UsersInfoTable(columnList.toArray(new String[columnList.size()]));
//
//            final JScrollPane scrollPane = new JScrollPane(resultsTable);
//            scrollPane.getViewport().setBackground(Color.white);
//
//            add(scrollPane, BorderLayout.CENTER);
//
//            resultsTable.addMouseListener(new MouseAdapter() {
//                public void mouseClicked(MouseEvent e) {
//                    if (e.getClickCount() == 2) {
//                        int row = resultsTable.getSelectedRow();
//                        openChatRoom(row);
//                    }
//                }
//
//                public void mouseReleased(MouseEvent e) {
//                    checkPopup(e);
//                }
//
//                public void mousePressed(MouseEvent e) {
//                    checkPopup(e);
//                }
//            });
//        }
//        else {
//            resultsTable.clearTable();
//        }
//        // Populate with answers
//        Iterator rows = data.getRows();
//        List<String> modelList;
//        while (rows.hasNext()) {
//            modelList = new ArrayList<String>();
//            ReportedData.Row row = (ReportedData.Row)rows.next();
//            for (int i = 0; i < resultsTable.getColumnCount(); i++) {
//                String tableValue = (String)resultsTable.getTableHeader().getColumnModel().getColumn(i).getHeaderValue();
//                Iterator columnIterator = data.getColumns();
//                while (columnIterator.hasNext()) {
//                    ReportedData.Column column = (ReportedData.Column)columnIterator.next();
//                    if (column.getLabel().equals(tableValue)) {
//                        tableValue = column.getVariable();
//                        break;
//                    }
//                }
//
//                String modelValue = getFirstValue(row, tableValue);
//                modelList.add(modelValue);
//            }
//
//            resultsTable.getTableModel().addRow(modelList.toArray());
//
//        }
//    }

    public void showUsersFound(List<SearchSpecialistEntity> data) {
        List<String> columnList = new ArrayList<String>();
        //Iterator columns = data.getColumns();
//        while (columns.hasNext()) {
//            ReportedData.Column column = (ReportedData.Column)columns.next();
//            String label = column.getLabel();
//            columnList.add(label);
//        }
        //汉化搜索列的名称
//        String[] strs = {"JID号","用户名","昵称","邮箱"};
//        columnList = Arrays.asList(strs);
        columnList.add("状态");
        columnList.add("专家号");
        columnList.add("专家姓名");
        columnList.add("分类");
        columnList.add("队列数");
        columnList.add("操作");
        if (resultsTable == null) {
            resultsTable = new UsersInfoTable(columnList.toArray(new String[columnList.size()]));
//            resultsTable.getTableModel().setColumnEditable(4, true);
//            ButtonCellEditor buttonCellEditor = new ButtonCellEditor();
//            resultsTable.getColumnModel().getColumn(4).setCellEditor(buttonCellEditor);//.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//            resultsTable.getColumnModel().getColumn(4).setCellRenderer(buttonCellEditor);
            final JScrollPane scrollPane = new JScrollPane(resultsTable);
            scrollPane.getViewport().setBackground(Color.white);

            add(scrollPane, BorderLayout.CENTER);

//            resultsTable.addMouseListener(new MouseAdapter() {
//                public void mouseClicked(MouseEvent e) {
//                    if (e.getClickCount() == 2) {
//                        int row = resultsTable.getSelectedRow();
//                        openChatRoom(row);
//                    }
//                }
//
//                public void mouseReleased(MouseEvent e) {
//                    checkPopup(e);
//                }
//
//                public void mousePressed(MouseEvent e) {
//                    checkPopup(e);
//                }
//            });
        }
        else {
            resultsTable.clearTable();
        }
        // Populate with answers
        Iterator<SearchSpecialistEntity> rows = data.iterator();
        List<Object> modelList;
        while (rows.hasNext()) {
            modelList = new ArrayList<Object>();
            SearchSpecialistEntity row = rows.next();
//            for (int i = 0; i < resultsTable.getColumnCount(); i++) {
//                String tableValue = (String)resultsTable.getTableHeader().getColumnModel().getColumn(i).getHeaderValue();
//                Iterator columnIterator = data.getColumns();
//                while (columnIterator.hasNext()) {
//                    ReportedData.Column column = (ReportedData.Column)columnIterator.next();
//                    if (column.getLabel().equals(tableValue)) {
//                        tableValue = column.getVariable();
//                        break;
//                    }
//                }
//
//                String modelValue = getFirstValue(row, tableValue);
//                modelList.add(modelValue);
//            }
            modelList.add(row.isOnline());
            modelList.add(row.getSpid());
            modelList.add(row.getSpTruename());
            modelList.add(row.getField());
            modelList.add(row.getSerivceQueue());
            resultsTable.getTableModel().setColumnEditable(5, true);
            ButtonCellEditor buttonCellEditor = new ButtonCellEditor();
            LabelCellEditor labelCellEditor = new LabelCellEditor();
            resultsTable.getColumnModel().getColumn(0).setCellRenderer(labelCellEditor);
            resultsTable.getColumnModel().getColumn(5).setCellEditor(buttonCellEditor);//.setCellEditor(new DefaultCellEditor(new JCheckBox()));
            resultsTable.getColumnModel().getColumn(5).setCellRenderer(buttonCellEditor);
            resultsTable.getColumnModel().getColumn(0).setPreferredWidth (50);
            resultsTable.getColumnModel().getColumn(0).setMaxWidth(50);
            resultsTable.getColumnModel().getColumn(0).setMinWidth(50);
            resultsTable.getColumnModel().getColumn(1).setPreferredWidth (90);
            resultsTable.getColumnModel().getColumn(1).setMaxWidth(90);
            resultsTable.getColumnModel().getColumn(1).setMinWidth(90);
            resultsTable.getColumnModel().getColumn(2).setPreferredWidth (90);
            resultsTable.getColumnModel().getColumn(2).setMaxWidth(90);
            resultsTable.getColumnModel().getColumn(2).setMinWidth(90);
            resultsTable.getColumnModel().getColumn(3).setPreferredWidth (200);
            resultsTable.getColumnModel().getColumn(3).setMaxWidth(200);
            resultsTable.getColumnModel().getColumn(3).setMinWidth(200);
            resultsTable.getColumnModel().getColumn(4).setPreferredWidth (70);
            resultsTable.getColumnModel().getColumn(4).setMaxWidth(70);
            resultsTable.getColumnModel().getColumn(4).setMinWidth(70);
            resultsTable.getColumnModel().getColumn(5).setPreferredWidth (70);
            resultsTable.getColumnModel().getColumn(5).setMaxWidth(70);
            resultsTable.getColumnModel().getColumn(5).setMinWidth(70);
            resultsTable.getTableModel().addRow(modelList.toArray());

        }
    }

    
//    private void checkPopup(MouseEvent e) {
//        if (!e.isPopupTrigger()) {
//            return;
//        }
//        // Get agent
//        final int row = resultsTable.rowAtPoint(e.getPoint());
//
//        final JPopupMenu menu = new JPopupMenu();
//
//        Action addContactAction = new AbstractAction() {
//            public void actionPerformed(ActionEvent e) {
//                RosterDialog dialog = new RosterDialog();
//                String jid = (String)resultsTable.getValueAt(row, 0);
//
//                TableColumn column = null;
//                try {
//                    column = resultsTable.getColumn("Name");//Username
//                }
//                catch (Exception ex) {
//                    try {
//                        column = resultsTable.getColumn("nick");
//                    }
//                    catch (Exception e1) {
//                        // Nothing to do
//                    }
//                }
//                if (column != null) {
//                    int col = column.getModelIndex();
//                    String nickname = (String)resultsTable.getValueAt(row, col);
//                    if (!ModelUtil.hasLength(nickname)) {
//                        nickname = StringUtils.parseName(jid);
//                    }
//                    dialog.setDefaultNickname(nickname);
//                }
//
//                dialog.setDefaultJID(jid);
//                dialog.showRosterDialogCenter();
//            }
//        };
//
//        Action chatAction = new AbstractAction() {
//            public void actionPerformed(ActionEvent e) {
//                openChatRoom(row);
//            }
//        };
//
//        Action profileAction = new AbstractAction() {
//            public void actionPerformed(ActionEvent e) {
//                VCardManager vcardSupport = SparkManager.getVCardManager();
//                String jid = (String)resultsTable.getValueAt(row, 0);
//                vcardSupport.viewProfile(jid, resultsTable);
//            }
//        };
//
//        final JMenuItem addAsContact = new JMenuItem(addContactAction);
//        addContactAction.putValue(Action.SMALL_ICON, SparkRes.getImageIcon(SparkRes.SMALL_ADD_IMAGE));
//        addContactAction.putValue(Action.NAME, Res.getString("menuitem.add.as.contact"));
//        menu.add(addAsContact);
//
//        final JMenuItem chatMenu = new JMenuItem(chatAction);
//        chatAction.putValue(Action.SMALL_ICON, SparkRes.getImageIcon(SparkRes.SMALL_MESSAGE_IMAGE));
//        chatAction.putValue(Action.NAME, Res.getString("menuitem.chat"));
//        menu.add(chatMenu);
//
//        final JMenuItem viewProfileMenu = new JMenuItem(profileAction);
//        profileAction.putValue(Action.SMALL_ICON, SparkRes.getImageIcon(SparkRes.SMALL_PROFILE_IMAGE));
//        profileAction.putValue(Action.NAME, Res.getString("menuitem.view.profile"));
//        menu.add(viewProfileMenu);
//
//
//        menu.show(resultsTable, e.getX(), e.getY());
//    }

    private final class UsersInfoTable extends Table {
        UsersInfoTable(String[] headers) {
            super(headers);
            getColumnModel().setColumnMargin(0);
            setSelectionBackground(Table.SELECTION_COLOR);
            setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            setRowSelectionAllowed(true);
        }
    }

//    /**
//     * Returns the first value found in the ReportedData.Row.
//     *
//     * @param row the ReportedData.Row.
//     * @param key the specified key in the ReportedData.Row.
//     * @return the first value found in the ReportedData.Row
//     */
//    public String getFirstValue(ReportedData.Row row, String key) {
//        try {
//            final Iterator rows = row.getValues(key);
//            while (rows.hasNext()) {
//                return (String)rows.next();
//            }
//        }
//        catch (Exception e) {
//            Log.error("Error retrieving the first value.", e);
//        }
//        return null;
//    }

//    private void openChatRoom(int row) {
//        String jid = (String)resultsTable.getValueAt(row, 0);
//        String nickname = StringUtils.parseName(jid);
//
//        TableColumn column;
//        try {
//            column = resultsTable.getColumn("nick");
//            int col = column.getModelIndex();
//            nickname = (String)resultsTable.getValueAt(row, col);
//            if (!ModelUtil.hasLength(nickname)) {
//                nickname = StringUtils.parseName(jid);
//            }
//        }
//        catch (Exception e1) {
//            // Ignore e1
//        }
//
//        ChatManager chatManager = SparkManager.getChatManager();
//        ChatRoom chatRoom = chatManager.createChatRoom(jid, nickname, nickname);
//
//        ChatContainer chatRooms = chatManager.getChatContainer();
//        chatRooms.activateChatRoom(chatRoom);
//    }

    /**
     * Clears the Search Results Table.
     */
    public void clearTable() {
        if (resultsTable != null) {
            resultsTable.clearTable();
        }
    }

}
